import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
import { LoggerService } from 'src/modules/shared/logger.service';

/**
 * LoggerMiddleware 类
 * 用于记录每个请求的日志信息，包括请求方法、URL、响应状态等
 */
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  constructor(private readonly logger: LoggerService) {}

  /**
   * 中间件的核心逻辑
   * @param req - HTTP 请求对象
   * @param res - HTTP 响应对象
   * @param next - 调用下一个中间件的函数
   */
  use(req: Request, res: Response, next: () => void) {
    // 获取请求信息
    const { method, originalUrl: url, ip: ipAddress } = req;
    const start = Date.now(); // 记录请求开始时间

    // 监听响应结束事件
    res.on('finish', () => {
      const { statusCode, statusMessage } = res; // 获取响应状态码和状态信息
      const responseTime = Date.now() - start; // 计算响应时间

      // 构建日志信息
      const logMessage = `[${method}] ${url} - ${statusCode} ${statusMessage} - ${responseTime}ms - IP: ${ipAddress}`;
      this.logger.log(logMessage); // 记录日志
    });

    // 监听连接关闭事件
    res.on('close', () => {
      if (!res.headersSent) {
        // 如果响应头未发送
        const responseTime = Date.now() - start; // 计算响应时间
        const logMessage = `[${method}] ${url} - Connection closed before response - ${responseTime}ms - IP: ${ipAddress}`;
        this.logger.warn(logMessage); // 记录警告日志
      }
    });

    next(); // 继续处理请求
  }
}
